package com.example.springmvc.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

// 请求转发 请求重定向
//1.转发，它的URL是不会改变的
// 重定向，URL地址变成了访问页面的地址
//2.转发 浏览器只需要发送一条请求， 就能获取到网页信息。
// 重定向 浏览器需要发送两条请求 才能获取网页信息(意思是前端向后端要数据 后端只告诉他去哪里拿 前端需要自己去获取)
//3.需要注意的是:重定向，数据是不共享的。
// 就是我给你的地址，你能不能访问到数据，是不确定的
// 万一，这份数据是需要权限的，但是你没有，那就访问不了了。或者这网站，被注销了，你也是访问不了的!
@Controller
@RequestMapping("/test2")
public class TestController2 {

    // 请求转发返回的是一个界面 所以不能使用@RestController
    // 实现forward操作
    // 1.通过注解的方式
    @RequestMapping("/myforward")
    public String myForward() {
        // 返回一个页面信息
        // 当我们访问到myForward方法 执行到return时
        // 请求转发 是服务器端的一个行为
        // 服务器端会访问这个界面 并且将界面的数据返回给客户端
        return "forward:/hello.html";
    }
    // 2.基于servlet API实现
    @RequestMapping("/myforward2")
    public void myForward2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过getRequestDispatcher 方法获取请求调度器 里面的参数 就是跳转网页的地址
        //后面再让调度器使用forward方法(将请求和响应对象，作为其参数) 进行请求转发
        //在服务器接收请求之后 通过调用getRequestDispatcher方法获取转发资源
        //再通过forward将请求查询到内容 写到响应中 返回给前端
        //注意的是forward是需要处理异常的 因为转发的地址 可能不存在
        request.getRequestDispatcher("/hello.html").forward(request,response);
    }

    // 3.最简单方式可以自己return界面
    // 将数据返回给前端
    @RequestMapping("/hello")
    public String sayHi() {
        return "/hello.html";
    }








    // redirect请求重定向
    // 1.通过注解的方式
    @RequestMapping("/redirect")
    public String myRedirect() {
        // 访问http://localhost:8080/test2/redirect
        // 会跳转到http://localhost:8080/hello.html
        return "redirect:/hello.html";
    }
    // 2.基于servlet API实现
    @RequestMapping("/redirect2")
    public void myRedirect2(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //sendRedirect发送一个302重定向的响应给前端
        response.sendRedirect("/hello.html");
    }
}
